package code.part05_IO;

import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.IOException;

/**
 * @author: ZJT
 * @Time: 2021/7/20
 * @Description: File
 */
public class P01_File {

    /**
     * @author: ZJT
     * @Time: 2021/7/20
     * @Description: 创建文件
     * @param:
     * @return:
     * @throws:
     */
    @Test
    public void create() throws IOException {

        File file = new File("src/code/part05_IO/abc.txt");

        //创建文件
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //无论当前文件是否存在，只要给定具体的路径，都可以返回相应的路径名称
        File file2 = new File("D:\\test");
        System.out.println(file2.getAbsolutePath());
    }

    /**
     * @author: ZJT
     * @Time: 2021/7/20
     * @Description: 属性
     * @param:
     * @return:
     * @throws:
     */
    @Test
    public void param() throws IOException {

        File file = new File("src/code/part05_IO/abc.txt");


        //判断文件的属性，都会返回boolean类型的值
        //是否允许执行
        System.out.println(file.canExecute());
        //是否可读
        System.out.println(file.canRead());
        //是否可写
        System.out.println(file.canWrite());

        //判断当前文件是否存在
        System.out.println(file.exists());

        //获取文件的名称
        System.out.println(file.getName());
        //获取文件的绝对路径
        System.out.println(file.getAbsolutePath());
        //获取文件的父路径名称，如果文件的路径中只包含文件名称，则显示空
        System.out.println(file.getParent());
        //返回文件绝对路径的规范格式
        System.out.println(file.getCanonicalPath());
        //返回操作系统的文件分割符
        System.out.println(File.separator);
        //判断文件是否是文件或者目录
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
    }

    /**
     * @author: ZJT
     * @Time: 2021/7/20
     * @Description: 方法属性
     * @param:
     * @return:
     * @throws:
     */
    @Test
    public void method() throws IOException {

        File file = new File("src/code");

        String[] list = file.list();
        for (String str : list) {
            System.out.println(list.toString());
        }
        System.out.println("---------------");

        File[] files = file.listFiles();
        for (File f : files) {
            System.out.println(f);
        }
        System.out.println("---------------");

        //打印操作系统的所有盘符
        File[] files1 = File.listRoots();
        for (int i = 0; i < files1.length; i++) {
            System.out.println(files1[i]);
        }
        System.out.println("---------------");


        //循环遍历输出所有文件的绝对路径
        //使用递归的方式
        printFile(new File("D:\\test"));
        printFile(new File("src/code"));
    }

    /**
     * @author: ZJT
     * @Time: 2021/7/20
     * @Description: 创建目录
     * @param:
     * @return:
     * @throws:
     */
    @Test
    public void mkdir() {
        File file = new File("D:\\test");
        //创建单级目录
        file.mkdir();
        file = new File("D:\\test\\a\\b");
        //创建多级目录
        file.mkdirs();
    }


    /**
     * 文件在遍历的时候，会出现空指针的问题，原因在于当前文件系统受保护，某些文件没有访问权限，此时会报空指针异常
     *
     * @param file
     */
    public static void printFile(File file) {

        if (file.isDirectory()) {
            File[] files = file.listFiles();
            for (File f : files) {
                printFile(f);
            }
        } else {
            System.out.println(file.getAbsolutePath());
        }

    }
}
